#version 460 core
out vec4 FragColor; //输出变量

uniform vec3 objectColor; //物体颜色
uniform vec3 lightColor; //灯光颜色

in vec3 Normal;//顶点着色器输入的法向量
in vec3 FragPos; //片段位置 由顶点着色器传入

uniform vec3 lightPos; //光源位置
uniform vec3 viewPos; //观察者位置
//材质
struct Material {
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
    float shininess;
};
uniform Material material; //材质
//光
struct Light {
    vec3 position;

    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
};
uniform Light light;
void main()
{
   //FragColor = vec4(lightColor * objectColor, 1.0); //物体片段着色器,物体反射的颜色=物体颜色*灯管颜色

// /***********************************光照***********************************/
//  /*
//   float ambientStrength = 0.1; //常量因子
//    vec3 ambient = ambientStrength * lightColor; //灯颜色
//    //环境光照
//   // vec3 result = ambient * objectColor; //物体反射颜色
//   // FragColor = vec4(result, 1.0); //结果
//
//     vec3 norm = normalize(Normal); //标准化
//     vec3 lightDir = normalize(lightPos - FragPos); //灯的方向 当计算光照时我们通常不关心一个向量的模长或它的位置，我们只关心它们的方向。所以，几乎所有的计算都使用单位向量完成，因为这简化了大部分的计算（比如点乘）
//   //对norm和lightDir向量进行点乘，计算光源对当前片段实际的漫发射影响。结果值再乘以光的颜色，得到漫反射分量。两个向量之间的角度越大，漫反射分量就会越小
//     float diff = max(dot(norm, lightDir), 0.0);
//     vec3 diffuse = diff * lightColor;
//
//     //漫反射光照
//  //   vec3 result = (ambient + diffuse) * objectColor;
//  //   FragColor = vec4(result, 1.0);
//
//     //镜面反射光照
//     float specularStrength = 0.5; //镜面强度(Specular Intensity)变量，给镜面高光一个中等亮度颜色，让它不要产生过度的影响
//     //计算视线方向向量，和对应的沿着法线轴的反射向量
//     vec3 viewDir = normalize(viewPos - FragPos);
//     vec3 reflectDir = reflect(-lightDir, norm);
//     //计算镜面分量
//     float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
//     vec3 specular = specularStrength * spec * lightColor;
//     vec3 result = (ambient + diffuse + specular) * objectColor;
//     FragColor = vec4(result, 1.0);
// */
//

// /*************************材质*********************************************8/
//    // 环境光
//    vec3 ambient = lightColor * material.ambient;
//    // 漫反射
//    vec3 norm = normalize(Normal);
//    vec3 lightDir = normalize(lightPos - FragPos);
//    float diff = max(dot(norm, lightDir), 0.0);
//    vec3 diffuse = lightColor * (diff * material.diffuse);
//    // 镜面光
//    vec3 viewDir = normalize(viewPos - FragPos);
//    vec3 reflectDir = reflect(-lightDir, norm);
//    float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
//    vec3 specular = lightColor * (spec * material.specular);
//    vec3 result = ambient + diffuse + specular;
//    FragColor = vec4(result, 1.0);
//

// /************************************改变光照强度****************************/
     // 环境光
     vec3 ambient  = light.ambient * material.ambient;
     // 漫反射
     vec3 norm = normalize(Normal);
     vec3 lightDir = normalize(lightPos - FragPos);
     float diff = max(dot(norm, lightDir), 0.0);
     vec3 diffuse  = light.diffuse * (diff * material.diffuse);
     // 镜面光
     vec3 viewDir = normalize(viewPos - FragPos);
     vec3 reflectDir = reflect(-lightDir, norm);
     float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
     vec3 specular = light.specular * (spec * material.specular);
     vec3 result = ambient + diffuse + specular;
     FragColor = vec4(result, 1.0);

}
